package socket;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * 图形化客户端
 *
 * 客户端提示词:
 * 基于上述代码实现图形化的客户端，要求窗口中包含一个文本域用来展示服务端发送过来的聊天消息。
 * 在文本域下方生成一个输入框，用来获取用户输入的聊天信息，在输入框右侧生成一个按钮，
 * 按钮上显示"发送"两个字。并且当点击按钮后可以将输入框中输入的内容发送给服务端。
 *
 *
 * 用豆包AI辅助补完功能步骤:
 * 1:先将我们的代码贴到AI中
 * 2:输入提示词内容
 * 3:将生成后的代码替换回来。如果AI将类名进行了修改，我们也可以延用他的类名，此时我们只需要在
 *   我们的包中创建对应的类，然后将代码粘贴进去即可。下面的代码就是
 *
 *
 */
public class ChatClient {
    private JFrame frame;
    private JTextArea messageArea;
    private JTextField inputField;
    private JButton sendButton;
    private Socket socket;
    private PrintWriter out;
    private BufferedReader in;

    public ChatClient() {
        // 初始化界面组件
        initComponents();
        // 连接到服务器
        connectToServer();
        // 启动消息接收线程
        startMessageListener();
    }

    private void initComponents() {
        // 创建主窗口
        frame = new JFrame("聊天客户端");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);
        frame.setLocationRelativeTo(null); // 居中显示

        // 创建消息显示区域
        messageArea = new JTextArea(15, 40);
        messageArea.setEditable(false);
        messageArea.setLineWrap(true);
        JScrollPane scrollPane = new JScrollPane(messageArea);

        // 创建输入面板
        inputField = new JTextField(30);
        sendButton = new JButton("发送");

        // 添加按钮点击事件处理
        sendButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendMessage();
            }
        });

        // 添加输入框回车事件处理
        inputField.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendMessage();
            }
        });

        // 布局管理
        JPanel inputPanel = new JPanel(new BorderLayout());
        inputPanel.add(inputField, BorderLayout.CENTER);
        inputPanel.add(sendButton, BorderLayout.EAST);

        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
        frame.getContentPane().add(inputPanel, BorderLayout.SOUTH);

        // 显示窗口
        frame.setVisible(true);
    }

    private void connectToServer() {
        try {
            messageArea.append("正在连接服务器...\n");
            socket = new Socket("localhost", 8088);
            messageArea.append("连接成功!\n");

            // 获取输出流
            OutputStream outputStream = socket.getOutputStream();
            out = new PrintWriter(outputStream, true);

            // 获取输入流
            InputStream inputStream = socket.getInputStream();
            InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
            in = new BufferedReader(reader);

        } catch (IOException e) {
            messageArea.append("连接服务器失败: " + e.getMessage() + "\n");
            e.printStackTrace();
        }
    }

    private void startMessageListener() {
        Thread messageThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String message;
                    while ((message = in.readLine()) != null) {
                        messageArea.append(message + "\n");
                        // 滚动到底部
                        messageArea.setCaretPosition(messageArea.getDocument().getLength());
                    }
                } catch (IOException e) {
                    messageArea.append("与服务器断开连接\n");
                    e.printStackTrace();
                }
            }
        });
        messageThread.setDaemon(true);
        messageThread.start();
    }

    private void sendMessage() {
        String message = inputField.getText().trim();
        if (!message.isEmpty()) {
            // 发送消息到服务器
            out.println(message);
            // 清空输入框
            inputField.setText("");
        }
    }

    public static void main(String[] args) {
        // 在事件调度线程中创建和显示GUI
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new ChatClient();
            }
        });
    }
}